package com.powernode.controller;


import com.powernode.common.Result;
import com.powernode.domain.User;
import com.powernode.dto.UploadBean;
import com.powernode.service.impl.UserService;
import com.powernode.utils.WebMVCUtils;
import com.sun.org.apache.bcel.internal.generic.NEW;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.UUID;

@RestController
@RequestMapping("/file")
@Api(tags = "文件上传的接口")
public class FileController {
    @Autowired
    private UserService userService;
    @Autowired
    private UploadBean uploadBean;

    //接受上传的文件
    @RequestMapping("/uploadImg.do")
    public Result download(MultipartFile mf) {
        //        System.out.println(mf);
//        System.out.println(mf.getContentType());
//        System.out.println(mf.getName());//文件域名 就是mf
//        System.out.println(mf.getOriginalFilename());//得到文件名
//        System.out.println(mf.getSize());//文件大小
        /**
         * 处理文件
         * 1,得到文件名
         * 2,修改文件名
         * 3,保存文件到硬盘
         * 4,构造相对路径  并把相对路径保存到数据库
         */
        String oldName = mf.getOriginalFilename();
        //更具老名字构造一个新的不重复的文件名
        String newName = createNewFileName(oldName);
        try { //保存临时空间的文件到指定地址/并删除临时空间的文件
            //mf.transferTo方法可以保存文件
            mf.transferTo(new File(uploadBean.getUploadPath() + newName));
            //走到这里说明文件已经上传，更新用户表里的img值
            //组装相对路径
            String path = newName;
            //得到当前用户的信息
            User user = new User();
            user.setId(WebMVCUtils.getCurrentUser().getId());
            //这里的path为文件名加后后缀
            user.setImg(path);
//                 更新数据库
            this.userService.updateByPrimaryKeySelective(user);
            String fullPath = uploadBean.getBaseURL() + path;
            //更新session中user的img值
            HttpSession session = WebMVCUtils.getSession();
            User user1 = WebMVCUtils.getCurrentUser();
            user1.setImg(path);
            session.setAttribute("user", user1);
            System.out.println(fullPath);
            return new Result(0, "文件上传成功", 0L, fullPath);

        } catch (Exception e) {
            e.printStackTrace();
            return new Result(-1, "文件上传失败");
        }

    }


    /**
     * 第二种方式介绍
     *
     * @Description: 文件下载示例
     */
    @RequestMapping("download.do")
    public ResponseEntity<Byte[]> download(String path) throws IOException {
        //path为文件名
        File file = new File(uploadBean.getUploadPath() + path);//本地磁盘文件
        if (!file.exists()) {
            return null;
        }
        //使用输入流，将文件读入到内存中
        FileInputStream stream = new FileInputStream(file);//找参照物 将程序运行的内存当参照物
        //文件的大小
        long length = file.length();
        //创建一个和文件一样大小的字节数组  一次性将数据读入到内存中  如果文件量过大，请求比较频繁 存在 崩溃的风险
        byte[] fileByte = new byte[(int) length];
        //一次性将文件数据读入到数组中
        stream.read(fileByte);
        // springmvc 中封装的 响应实体 ：
        //设置响应码
        //设置响应的数据头信息
        //设置响应数据
        HttpHeaders headers = new HttpHeaders();//响应头信息
        //设置响应的数据尾流数据，告诉浏览器，不要解析
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        //设置下载的文件名称，中文字符串要进行编码
        headers.setContentDispositionFormData("filename", path);
        ResponseEntity responseEntity = new ResponseEntity(fileByte, headers, HttpStatus.OK);
        return responseEntity;
    }


    //更具老名字构造一个新的不重复的文件名
    private String createNewFileName(String oldName) {
        //得到后缀名
        String s = oldName.substring(oldName.lastIndexOf("."));
        return UUID.randomUUID().toString().replace("-", "").toLowerCase() + s;
    }


}
